Skip to main content

83. Remove Duplicates from Sorted List

Question

Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.

Example 1:

Input: head = [1,1,2]
Output: [1,2]

Example 2:

Input: head = [1,1,2,3,3]
Output: [1,2,3]

Constraints:

The number of nodes in the list is in the range [0, 300].
-100 <= Node.val <= 100
The list is guaranteed to be sorted in ascending order.

Approach

  1. If the head is empty, return.
  2. Traverse the nodes, and compae its values to the next node.
  3. If the values are the same, save the next->next node for later.
  4. Delete the next node (since it is a duplicate).
  5. Link the node saved just now to the next of current node.
  6. Only move one node forward if there is no deletion of nodes.

Solution

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL) return head;

ListNode* curr = head;
ListNode* next = NULL;

while(curr -> next != NULL){
if(curr->val == curr->next->val){
next = curr->next->next;
delete curr->next;
curr->next = next;
}else{
curr = curr->next;
}
}
return head;
}
};